/**
 * WebSocket网关，负责在4000端口管理WebSocket连接，使用WebSocket传输协议。
 * 与WebsocketsService协作处理客户端连接和断开。
 */
import {
  WebSocketGateway,
  WebSocketServer,
  MessageBody,
  SubscribeMessage,
} from '@nestjs/websockets';
import { Server } from 'socket.io';
import { WebsocketsService } from './websockets.service';

/**
 * @WebSocketGateway(4000, {
 *   transports: ['websocket'],
 * })
 *
 * 装饰器配置WebSocket网关监听4000端口，仅使用WebSocket传输协议。
 */
@WebSocketGateway(4000, {
  transports: ['websocket'],
})
export class WebsocketsGateway {
  /**
   * @WebSocketServer() 装饰器注入底层Socket.IO服务器实例。
   * 将其分配给名为`server`的属性。
   */
  @WebSocketServer()
  server: Server;

  /**
   * 注入WebsocketsService实例，委托连接处理逻辑。
   * @param websocketsService - 负责处理WebSocket事件的服务。
   */
  constructor(private readonly websocketsService: WebsocketsService) {}

  /**
   * WebSocket服务器初始化后调用
   * @param server WebSocket服务器实例
   */
  afterInit() {
    console.log('WebSocket Gateway initialized');
  }

  /**
   * 当客户端连接到WebSocket服务器时调用。
   * 将连接处理委托给WebsocketsService。
   *
   * @param client - 表示连接的Socket.IO客户端实例。
   * @param ...args - Socket.IO在连接时传递的额外参数。
   */
  handleConnection() {
    this.websocketsService.handleConnection();
  }

  /**
   * 当客户端从WebSocket服务器断开连接时调用。
   * 将断开连接处理委托给WebsocketsService。
   *
   * @param client - 表示已断开连接的Socket.IO客户端实例。
   */
  handleDisconnect() {
    this.websocketsService.handleDisconnect();
  }

  @SubscribeMessage('message')
  handleMessage(@MessageBody() data: string) {
    console.log(data);
    const message = `Received message: ${data}`;
    this.server.emit('message', message); // 广播消息给所有客户端
  }
}
